﻿using DL.Tools;
using UnityEngine;

namespace DL.Characters.Camera
{
    public class CameraCollider : MonoBehaviour
    {
        [SerializeField, Header("相机碰撞最大偏移量")] private Vector2 colliderOffset;
        [SerializeField] private LayerMask colliderLayer;
        [SerializeField] private float colliderDetectionDistance;
        [SerializeField, Header("相机碰撞偏移平滑度")] private float cameraOffsetSmoothSpeed;
        private float m_CameraOriginOffset;
        private Vector3 m_CameraOrigionPosition;
        private Transform m_Camera;

        private void Awake()
        {
            if (UnityEngine.Camera.main != null) m_Camera = UnityEngine.Camera.main.transform;
        }

        private void Start()
        {
            m_CameraOriginOffset = colliderOffset.y;
            m_CameraOrigionPosition = transform.localPosition.normalized; //0f,0f,-1f
        }

        private void LateUpdate()
        {
            DetectionCameraCollider();
        }

        private void DetectionCameraCollider()
        {
            //将原始位置转成世界坐标系后，(只是坐标系变了，位置还是原来的位置。)再乘以射线长度，最后得到的那个位置就是检测点最远的点。
            //射线末端就在最远的那个点。
            Vector3 desiredOffsetDistance =
                transform.TransformPoint(m_CameraOrigionPosition * colliderDetectionDistance);
            m_CameraOriginOffset =
                Physics.Linecast(transform.position, desiredOffsetDistance, out var hit, colliderLayer)
                    ? Mathf.Clamp(hit.distance * 0.6f, colliderOffset.x, colliderOffset.y)
                    : colliderOffset.y;

            m_Camera.localPosition = Vector3.Lerp(m_Camera.localPosition,
                m_CameraOrigionPosition * (m_CameraOriginOffset - 0.2f),
                DevelopmentToos.UnTetheredLerp(cameraOffsetSmoothSpeed));
            //在没有发生碰撞时，摄像机就是MainCamera的位置会到达，当前物体的原始点，就是0，0，-1f的位置，
            //再乘以起始的偏移量默认是3，那么就是-3的位置，但是括号减去； 0.1，那么最终摄像机所在的位置就是再-2.9的位置。
            //在发生碰撞后，摄像机会从-2.9这个位置慢慢往前移动。因为发生碰撞后，_cameraOriginOffset会慢慢往正值增加。
            //假设_cameraOriginOffset增加到了-1f，再减去0.1f就是-1.1，_cameraOrigionPosition * -1.1，
            //就是相机发生碰撞后所在的位置。
        }

    }
}